#include <iostream>

using namespace std;


class A {
    private:
    int i;
    int *p;
    public:
    A () {i = 0 ; p = 0; cout << "A::A()" << endl;} // 注意：构造函数没有初始化指针p，此时p是一个野指针
    ~A() {if (p) delete p; cout << "A::~A(),i = "<< i << endl;} //如果p不为空，释放p
    void set(int i) {this->i = i;}
    void f() {
        p = new int;
        cout << "Hello, World!" << endl;
    }
    void g( A* q) {cout << q->i << endl;}
};

int main() {
    A* p = new A[10]; // 打印10次构造函数
    for (int i = 0; i < 10; i++) {
        p[i].set(i);
    }
    A b;
    b.set(100);
    p[0].g(&b); // P0和B是两个不同的对象，但是可以通过指针访问B的私有成员
    delete [] p; // 打印10次析构函数
    return 0;
}

// /e/code/cpp/lesson10] :master
// ❯ ./a.out 
// A::A()
// A::A()
// A::A()
// A::A()
// A::A()
// A::A()
// A::A()
// A::A()
// A::A()
// A::A()
// A::~A(),i = 9
// A::~A(),i = 8
// A::~A(),i = 7
// A::~A(),i = 6
// A::~A(),i = 5
// A::~A(),i = 4
// A::~A(),i = 3
// A::~A(),i = 2
// A::~A(),i = 1
// A::~A(),i = 0